home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / General / CIncludesTool / original version / source files / reformat.c < prev    next >
C/C++ Source or Header  |  1990-07-29  |  3KB  |  145 lines

  1. #include "CIncludesCode.h"
  2.  
  3. #include <Memory.h>
  4. #include <OSUtils.h>
  5. #include <StdIO.h>
  6. #include <ToolUtils.h>
  7.  
  8. extern Handle            database;
  9. extern dataHeaderType    dataHeader;
  10.  
  11. Handle    textHdl;
  12. Handle    arrayHdl;
  13. long    includeOffset;
  14.  
  15.  
  16. short findNameIndex( char *s )
  17. {
  18.     short        i;
  19.     strArray    *sp = (strArray*) (*database + dataHeader.nameArrayOffset);
  20.     
  21.     for ( i = 0; i < dataHeader.numFiles; ++i )
  22.         if ( equalStringsUncased( s, (*sp)[i]) )
  23.             return i;
  24.     return -1;
  25. }
  26.  
  27.  
  28. long removeLine( long pos )
  29. {
  30.     long    p;
  31.     char    *dp = StripAddress( *textHdl );
  32.     
  33.     while ( (pos > 0) && (*(dp + pos - 1) != '\n') )
  34.         --pos;
  35.     
  36.     p = pos;
  37.     while ( *(dp + p) != '\n' ) ++p;
  38.     
  39.     return Munger( textHdl, pos, 0, (p - pos + 1), dp, 0 );
  40. }
  41.  
  42.  
  43. void extract()
  44. {
  45.     short   fileIndex;
  46.     long    pos = 0;
  47.     long    limit = GetHandleSize( textHdl );
  48.     char    s[256];
  49.     
  50.     includeOffset = -1;
  51.     
  52.     while ( (pos = nextInclude( textHdl, pos, limit )) < limit )
  53.     {
  54.         extractFileName( s, *textHdl + pos );
  55.         
  56.         if ( (fileIndex = findNameIndex( s )) != -1 )
  57.         {
  58.             *( *arrayHdl + fileIndex ) = 1;
  59.             pos = removeLine( pos );
  60.             if ( includeOffset == -1 )
  61.                 includeOffset = pos;
  62.             limit = GetHandleSize( textHdl );
  63.         }
  64.     }
  65. }
  66.  
  67.  
  68. void prune()
  69. {
  70.     short    i, j;
  71.     char     *p = StripAddress( *arrayHdl );        // dereference
  72.     
  73.     for ( i = 0; i < dataHeader.numFiles; ++i )
  74.         if ( *(p + i) )
  75.             for ( j = 0; j < dataHeader.numFiles; ++j )
  76.                 if ( *(p + j)  &&
  77.                       (i != j) &&
  78.                       isDependent( *database + dataHeader.dependencyArrayOffset, j, i )  )
  79.                     {
  80.                         *(p + i) = 0;
  81.                         break;
  82.                     }
  83. }
  84.  
  85.  
  86. void reinsert()
  87. {
  88.     short    i;
  89.     char    s[256];
  90.     
  91.     for ( i = 0; i < dataHeader.numFiles; ++i )
  92.     if ( *( *arrayHdl + i ) )
  93.     {
  94.         sprintf( s, "#include <%s>\n", getNamePtr( i ) );
  95.         includeOffset = Munger( textHdl, includeOffset, 0, 0, s, strlen( s ) );
  96.     }
  97. }
  98.  
  99.  
  100. int    reformat( char *src )
  101. {        
  102.     FILE    *f = fopen( src, "r" );
  103.     long    len;
  104.  
  105.     if ( !f ) errorExit( "Could not open selection" );
  106.  
  107.     (void) fseek( f, 0, SEEK_END );
  108.     if ( !(len = ftell( f )) )
  109.     {
  110.         SysBeep(1);
  111.         return 0;
  112.     }
  113.  
  114.     textHdl    = NewHandle( len );
  115.         checkMemory();
  116.     arrayHdl = NewHandleClear( dataHeader.numFiles );
  117.         checkMemory();
  118.     
  119.     (void) fseek( f, 0, SEEK_SET );
  120.     
  121.     HLock( textHdl );
  122.     if ( fread( *textHdl, 1, len, f ) != len )
  123.         errorExit( "Read selection failed" );
  124.     HUnlock( textHdl );
  125.     
  126.     if ( *(*textHdl + len - 1) != '\n' )
  127.     {
  128.         (void) Munger( textHdl, len, 0, 0, "\n", 1);
  129.             checkMemory();
  130.     }
  131.  
  132.     extract();
  133.     prune();
  134.     reinsert();
  135.     
  136.     f = freopen( src, "w", f );
  137.     HLock( textHdl );
  138.     (void) fwrite( *textHdl, 1, GetHandleSize( textHdl ), f );
  139.  
  140.     DisposHandle( textHdl );
  141.     DisposHandle( arrayHdl );
  142.     
  143.     return 0;
  144. }
  145.